Auto-disable IRQ balancing/affinity on buggy chipsets.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 14 Jul 2005 11:09:21 +0000 (11:09 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 14 Jul 2005 11:09:21 +0000 (11:09 +0000)
Signed-off-by: Keir Fraser <keir@xensource.com>
linux-2.6-xen-sparse/arch/xen/i386/kernel/Makefile
linux-2.6-xen-sparse/arch/xen/x86_64/kernel/Makefile
xen/arch/x86/dom0_ops.c
xen/arch/x86/irq.c
xen/include/public/dom0_ops.h

index fe6e9db10736765cd0ad972ceeb80b93821de73a..a559ddc54ed097d5262340345425b832e8ef506a 100644 (file)
@@ -10,12 +10,12 @@ extra-y := head.o init_task.o
 
 obj-y  := process.o signal.o entry.o traps.o \
                time.o ioport.o ldt.o setup.o \
-               pci-dma.o i386_ksyms.o irq.o
+               pci-dma.o i386_ksyms.o irq.o quirks.o
 
 c-obj-y        := semaphore.o vm86.o \
                ptrace.o sys_i386.o \
                i387.o dmi_scan.o bootflag.o \
-               doublefault.o quirks.o
+               doublefault.o
 s-obj-y        :=
 
 obj-y                          += cpu/
index 8b30e7c99bf8610b9a1e91bf82a337469032e8c1..ed4d0156f08277cd27e67d9bc91824c0f1021b74 100644 (file)
@@ -51,7 +51,7 @@ topology-y                     += ../../../i386/mach-default/topology.o
 swiotlb-$(CONFIG_SWIOTLB)      += ../../../ia64/lib/swiotlb.o
 microcode-$(subst m,y,$(CONFIG_MICROCODE))  += ../../../i386/kernel/microcode.o
 intel_cacheinfo-y              += ../../../i386/kernel/cpu/intel_cacheinfo.o
-quirks-y                       += ../../../i386/kernel/quirks.o
+quirks-y                       += ../../i386/kernel/quirks.o
 
 c-link := init_task.o
 s-link := vsyscall.o 
index ff606ca1c7811352a66dd73385439a443fe0d1a8..b933cbdfaae0b2519c0399e0fde4cca2e15d98e5 100644 (file)
@@ -18,6 +18,7 @@
 #include <xen/trace.h>
 #include <xen/console.h>
 #include <asm/shadow.h>
+#include <asm/irq.h>
 #include <public/sched_ctl.h>
 
 #include <asm/mtrr.h>
@@ -371,6 +372,23 @@ long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op)
     }
     break;
 
+    case DOM0_PLATFORM_QUIRK:
+    {
+        extern int opt_noirqbalance;
+        switch ( op->u.platform_quirk.quirk_id )
+        {
+        case QUIRK_NOIRQBALANCING:
+            printk("Platform quirk -- Disabling IRQ balancing/affinity.\n");
+            opt_noirqbalance = 1;
+            setup_ioapic_dest();
+            break;
+        default:
+            ret = -EINVAL;
+            break;
+        }
+    }
+    break;
+
     default:
         ret = -ENOSYS;
 
index c46811fd6141cbb2ae01e0c98bc62946d37cd2d5..e0553486bc5668cc6096e83b19351a10f0a2b7e7 100644 (file)
@@ -16,7 +16,7 @@
 #include <asm/smpboot.h>
 
 /* opt_noirqbalance: If true, software IRQ balancing/affinity is disabled. */
-static int opt_noirqbalance = 0;
+int opt_noirqbalance = 0;
 boolean_param("noirqbalance", opt_noirqbalance);
 
 irq_desc_t irq_desc[NR_IRQS];
index 2502edd75a7621270f5284a1417e174961a669fc..f5bad95badecd28c38a5775ef0e2c48fdedb4f28 100644 (file)
@@ -357,7 +357,7 @@ typedef struct {
     u64     cpu_time;                 
 } dom0_getvcpucontext_t;
 
-#define DOM0_GETDOMAININFOLIST    38
+#define DOM0_GETDOMAININFOLIST   38
 typedef struct {
     /* IN variables. */
     domid_t               first_domain;
@@ -367,6 +367,13 @@ typedef struct {
     memory_t              num_domains;
 } dom0_getdomaininfolist_t;
 
+#define DOM0_PLATFORM_QUIRK      39  
+#define QUIRK_NOIRQBALANCING  1
+typedef struct {
+    /* IN variables. */
+    int quirk_id;
+} dom0_platform_quirk_t;
+
 typedef struct {
     u32 cmd;
     u32 interface_version; /* DOM0_INTERFACE_VERSION */
@@ -400,6 +407,7 @@ typedef struct {
         dom0_ioport_permission_t ioport_permission;
         dom0_getvcpucontext_t    getvcpucontext;
         dom0_getdomaininfolist_t getdomaininfolist;
+        dom0_platform_quirk_t    platform_quirk;
     } u;
 } dom0_op_t;